. Loading and preparing data
if (!file.exists("data.csv")) {
tmp <- read_delim("http://app.ntsb.gov/aviationquery/Download.ashx?type=csv",
"|", na = c("NA", "", "N/A"))
write_csv(tmp[, 1:(ncol(tmp) - 1)], "data.csv")
}
raw_dat <- read_csv("data.csv") %>%
mutate(`Event Date` = mdy(`Event Date`)) %>%
filter(year(`Event Date`) >= 1982, year(`Event Date`) < 2018,
`Investigation Type` == "Accident", Country == "United States") %>%
mutate(`Total Fatal Injuries` = ifelse(is.na(`Total Fatal Injuries`), 0, `Total Fatal Injuries`),
`Total Serious Injuries` = ifelse(is.na(`Total Serious Injuries`), 0, `Total Serious Injuries`),
`Total Minor Injuries` = ifelse(is.na(`Total Minor Injuries`), 0, `Total Minor Injuries`))
Parsed with column specification:
cols(
.default = col_character(),
Latitude = col_double(),
Longitude = col_double(),
`Number of Engines` = col_integer(),
`Total Fatal Injuries` = col_integer(),
`Total Serious Injuries` = col_integer(),
`Total Minor Injuries` = col_integer(),
`Total Uninjured` = col_integer()
)
See spec(...) for full column specifications.
raw_dat
. Time
##. Preparing data
byday_dat <- raw_dat %>%
group_by(`Event Date`) %>%
summarize(Events = n(),
`Total Fatal Injuries` = sum(`Total Fatal Injuries`, na.rm = TRUE),
`Total Serious Injuries` = sum(`Total Serious Injuries`, na.rm = TRUE),
`Total Minor Injuries` = sum(`Total Minor Injuries`, na.rm = TRUE)) %>%
complete(`Event Date` = seq.Date(ymd("1982-01-01"), ymd("2017-12-31"), by = 1),
fill = list(Events = 0,
`Total Fatal Injuries` = 0,
`Total Serious Injuries` = 0,
`Total Minor Injuries` = 0)) %>%
mutate(Year = year(`Event Date`),
Month = month(`Event Date`, label = TRUE),
Week = week(`Event Date`),
Day = wday(`Event Date`, label = TRUE, week_start = 1))
byday_dat
. Number of accidents per month since 1982
g <- byday_dat %>%
group_by(Month_end = ceiling_date(`Event Date`, unit = "months")) %>%
summarize(Events = sum(Events)) %>%
ggplot(aes(x = Month_end, y = Events)) +
geom_line() +
geom_line(stat = "smooth", method = loess, se = FALSE, size = 2, color = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation accidents, 1982-2017", size = 8)
gSubtitle <- gz_title("per month, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Number of fatalities per month since 1982
g <- byday_dat %>%
group_by(Month_end = ceiling_date(`Event Date`, unit = "months")) %>%
summarize(`Total Fatal Injuries` = sum(`Total Fatal Injuries`)) %>%
ggplot(aes(x = Month_end, y = `Total Fatal Injuries`)) +
geom_line() +
geom_line(stat = "smooth", method = loess, se = FALSE, size = 2, color = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation fatalities, 1982-2017", size = 8)
gSubtitle <- gz_title("per month, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Number of injuries per month since 1982
g <- byday_dat %>%
group_by(Month_end = ceiling_date(`Event Date`, unit = "months")) %>%
summarize(Injuries = sum(`Total Serious Injuries`) + sum(`Total Minor Injuries`)) %>%
ggplot(aes(x = Month_end, y = Injuries)) +
geom_line() +
geom_line(stat = "smooth", method = loess, se = FALSE, size = 2, color = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation non-lethal injuries, 1982-2017", size = 8)
gSubtitle <- gz_title("per month, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Month with most accidents
g <- byday_dat %>%
group_by(Month) %>%
summarize(total = sum(Events)) %>%
ggplot(aes(x = Month, y = total, group = 1)) +
geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation accidents, 1982-2017", size = 8)
gSubtitle <- gz_title("total by month, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Days with most accidents
g <- byday_dat %>%
group_by(Day) %>%
summarize(total = sum(Events)) %>%
ggplot(aes(x = Day, y = total, group = 1)) +
geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation accidents, 1982-2017", size = 8)
gSubtitle <- gz_title("total by day, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Month with most fatalities
g <- byday_dat %>%
group_by(Month) %>%
summarize(total = sum(`Total Fatal Injuries`)) %>%
ggplot(aes(x = Month, y = total, group = 1)) +
geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation fatalities, 1982-2017", size = 8)
gSubtitle <- gz_title("total by month, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Days with most fatalities
g <- byday_dat %>%
group_by(Day) %>%
summarize(total = sum(`Total Fatal Injuries`)) %>%
ggplot(aes(x = Day, y = total, group = 1)) +
geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation fatalities, 1982-2017", size = 8)
gSubtitle <- gz_title("total by day, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Month with most injuries
g <- byday_dat %>%
group_by(Month) %>%
summarize(total = sum(`Total Serious Injuries`) + sum(`Total Minor Injuries`)) %>%
ggplot(aes(x = Month, y = total, group = 1)) +
geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation non-lethal injuries, 1982-2017", size = 8)
gSubtitle <- gz_title("total by month, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Days with most injuries
g <- byday_dat %>%
group_by(Day) %>%
summarize(total = sum(`Total Serious Injuries`) + sum(`Total Minor Injuries`)) %>%
ggplot(aes(x = Day, y = total, group = 1)) +
geom_bar(stat = "identity", color = "#DB4A36", fill = "#DB4A36", alpha = 0.75) +
ylim(0, NA) +
xlab(NULL) + ylab(NULL) +
theme_graphzoo(base_size = 20)
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("US civil aviation non-lethal injuries, 1982-2017", size = 8)
gSubtitle <- gz_title("total by day, within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
gz_combine(g, gTitle, gSubtitle, gBanner,
top = c(0.9, 1, 1, 0.05),
bottom = c(0.0125, 0, 0, 0))

. Space
. Preparing data
loc_dat <- raw_dat %>%
filter(year(`Event Date`) >= 2002, year(`Event Date`) < 2018,
!is.na(Latitude), !is.na(Longitude)) %>%
mutate(Date_round = ceiling_date(`Event Date`, unit = "3 days"),
Longitude = ifelse(Longitude > 0, -Longitude, Longitude))
loc_dat
xlim <- c(-180, -20)
ylim <- c(10, 72)
world_dat <- map_data("world") %>%
rename(X = long, Y = lat, PID = group, POS = order) %>%
clipPolys(xlim = xlim, ylim = ylim, keepExtra = TRUE) %>%
as_tibble()
world_dat
. Animated map
if (!file.exists("animation.mp4")) {
gBackground <- gz_background()
gBanner <- gz_banner(l.txt = "GRAPHZOO.TUMBLR.COM",
r.txt = "DATA: NTSB",
font.size = 4)
gTitle <- gz_title("Locations of US civil aviation accidents, 2002-2017", size = 8)
gSubtitle <- gz_title("within the USA, its territories and possessions, and in international waters",
y = 0.9125, size = 5, fontface = "italic")
saveVideo({
dates <- seq.Date(ymd("2002-01-01"), ymd("2017-12-31"), by = 3)
for (i in seq(1:length(dates))) {
g <- ggplot() +
geom_polygon(data = world_dat, aes(x = X, y = Y, group = PID),
fill = "gray50", color = "white") +
geom_point(data = filter(loc_dat, Date_round <= dates[i], Date_round >= (dates[i] - 60)),
aes(x = Longitude, y = Latitude, alpha = 60 - as.numeric(dates[i] - Date_round)),
pch = 21, fill = "#DB4A36", color = "black", size = 3) +
annotate("text", x = -180, y = 11, hjust = 0, vjust = 0,
label = format(dates[i], format = "%b %Y")) +
coord_map(xlim = xlim, ylim = ylim) +
xlab(NULL) + ylab(NULL) + guides(alpha = FALSE) +
theme_graphzoo(base_size = 18) +
theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(),
panel.grid.major = element_blank(), panel.grid.minor = element_blank())
gz_combine(gBackground, g, gTitle, gSubtitle, gBanner,
top = c(1, 0.9, 1, 1, 0.05),
bottom = c(0.05, 0.0125, 0.05, 0.05, 0))
}
}, ani.height = 480, ani.width = 720, interval = 1 / 30)
}
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHllcwotLS0KCiMgLiBTZXR0aW5nIHVwCgpgYGB7cn0KaWYgKCFyZXF1aXJlKHBhY21hbikpCiAgaW5zdGFsbC5wYWNrYWdlcygicGFjbWFuIikKCnBhY21hbjo6cF9sb2FkKHRpYmJsZSwgcmVhZHIsIGRwbHlyLCB0aWR5ciwgbHVicmlkYXRlLCBzdHJpbmdyLCBnZ3Bsb3QyLCBQQlNtYXBwaW5nLCBhbmltYXRpb24pCnBhY21hbjo6cF9sb2FkX2doKCJzam1nYXJuaWVyL2dyYXBoWm9vIikKYGBgCgojIC4gTG9hZGluZyBhbmQgcHJlcGFyaW5nIGRhdGEKCmBgYHtyfQppZiAoIWZpbGUuZXhpc3RzKCJkYXRhLmNzdiIpKSB7CiAgdG1wIDwtIHJlYWRfZGVsaW0oImh0dHA6Ly9hcHAubnRzYi5nb3YvYXZpYXRpb25xdWVyeS9Eb3dubG9hZC5hc2h4P3R5cGU9Y3N2IiwgCiAgICAgICAgICAgICAgICAgICAgInwiLCBuYSA9IGMoIk5BIiwgIiIsICJOL0EiKSkKICB3cml0ZV9jc3YodG1wWywgMToobmNvbCh0bXApIC0gMSldLCAiZGF0YS5jc3YiKQp9CiAgCnJhd19kYXQgPC0gcmVhZF9jc3YoImRhdGEuY3N2IikgJT4lCiAgbXV0YXRlKGBFdmVudCBEYXRlYCA9IG1keShgRXZlbnQgRGF0ZWApKSAlPiUKICBmaWx0ZXIoeWVhcihgRXZlbnQgRGF0ZWApID49IDE5ODIsIHllYXIoYEV2ZW50IERhdGVgKSA8IDIwMTgsCiAgICAgICAgIGBJbnZlc3RpZ2F0aW9uIFR5cGVgID09ICJBY2NpZGVudCIsIENvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiKSAlPiUKICBtdXRhdGUoYFRvdGFsIEZhdGFsIEluanVyaWVzYCA9IGlmZWxzZShpcy5uYShgVG90YWwgRmF0YWwgSW5qdXJpZXNgKSwgMCwgYFRvdGFsIEZhdGFsIEluanVyaWVzYCksCiAgICAgICAgIGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCA9IGlmZWxzZShpcy5uYShgVG90YWwgU2VyaW91cyBJbmp1cmllc2ApLCAwLCBgVG90YWwgU2VyaW91cyBJbmp1cmllc2ApLAogICAgICAgICBgVG90YWwgTWlub3IgSW5qdXJpZXNgID0gaWZlbHNlKGlzLm5hKGBUb3RhbCBNaW5vciBJbmp1cmllc2ApLCAwLCBgVG90YWwgTWlub3IgSW5qdXJpZXNgKSkKcmF3X2RhdApgYGAKCiMgLiBUaW1lIAoKIyMuIFByZXBhcmluZyBkYXRhCgpgYGB7cn0KYnlkYXlfZGF0IDwtIHJhd19kYXQgJT4lCiAgZ3JvdXBfYnkoYEV2ZW50IERhdGVgKSAlPiUKICBzdW1tYXJpemUoRXZlbnRzID0gbigpLAogICAgICAgICAgICBgVG90YWwgRmF0YWwgSW5qdXJpZXNgID0gc3VtKGBUb3RhbCBGYXRhbCBJbmp1cmllc2AsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCA9IHN1bShgVG90YWwgU2VyaW91cyBJbmp1cmllc2AsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBUb3RhbCBNaW5vciBJbmp1cmllc2AgPSBzdW0oYFRvdGFsIE1pbm9yIEluanVyaWVzYCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgY29tcGxldGUoYEV2ZW50IERhdGVgID0gc2VxLkRhdGUoeW1kKCIxOTgyLTAxLTAxIiksIHltZCgiMjAxNy0xMi0zMSIpLCBieSA9IDEpLAogICAgICAgICAgIGZpbGwgPSBsaXN0KEV2ZW50cyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgYFRvdGFsIEZhdGFsIEluanVyaWVzYCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgIGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgYFRvdGFsIE1pbm9yIEluanVyaWVzYCA9IDApKSAlPiUKICBtdXRhdGUoWWVhciA9IHllYXIoYEV2ZW50IERhdGVgKSwKICAgICAgICAgTW9udGggPSBtb250aChgRXZlbnQgRGF0ZWAsIGxhYmVsID0gVFJVRSksCiAgICAgICAgIFdlZWsgPSB3ZWVrKGBFdmVudCBEYXRlYCksCiAgICAgICAgIERheSA9IHdkYXkoYEV2ZW50IERhdGVgLCBsYWJlbCA9IFRSVUUsIHdlZWtfc3RhcnQgPSAxKSkKYnlkYXlfZGF0CmBgYAoKIyMgLiBOdW1iZXIgb2YgYWNjaWRlbnRzIHBlciBtb250aCBzaW5jZSAxOTgyCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NC41fQpnIDwtIGJ5ZGF5X2RhdCAlPiUKICBncm91cF9ieShNb250aF9lbmQgPSBjZWlsaW5nX2RhdGUoYEV2ZW50IERhdGVgLCB1bml0ID0gIm1vbnRocyIpKSAlPiUKICBzdW1tYXJpemUoRXZlbnRzID0gc3VtKEV2ZW50cykpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoX2VuZCwgeSA9IEV2ZW50cykpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9saW5lKHN0YXQgPSAic21vb3RoIiwgbWV0aG9kID0gbG9lc3MsIHNlID0gRkFMU0UsIHNpemUgPSAyLCBjb2xvciA9ICIjREI0QTM2IiwgYWxwaGEgPSAwLjc1KSArCiAgeWxpbSgwLCBOQSkgKwogIHhsYWIoTlVMTCkgKyB5bGFiKE5VTEwpICsgCiAgdGhlbWVfZ3JhcGh6b28oYmFzZV9zaXplID0gMjApCgpnQmFubmVyIDwtIGd6X2Jhbm5lcihsLnR4dCA9ICJHUkFQSFpPTy5UVU1CTFIuQ09NIiwgCiAgICAgICAgICAgICAgICAgICAgIHIudHh0ID0gIkRBVEE6IE5UU0IiLAogICAgICAgICAgICAgICAgICAgICBmb250LnNpemUgPSA0KQpnVGl0bGUgPC0gZ3pfdGl0bGUoIlVTIGNpdmlsIGF2aWF0aW9uIGFjY2lkZW50cywgMTk4Mi0yMDE3Iiwgc2l6ZSA9IDgpCmdTdWJ0aXRsZSA8LSBnel90aXRsZSgicGVyIG1vbnRoLCB3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICB5ID0gMC45MTI1LCBzaXplID0gNSwgZm9udGZhY2UgPSAiaXRhbGljIikKCmd6X2NvbWJpbmUoZywgZ1RpdGxlLCBnU3VidGl0bGUsIGdCYW5uZXIsCiAgICAgICAgICAgdG9wID0gYygwLjksIDEsIDEsIDAuMDUpLCAKICAgICAgICAgICBib3R0b20gPSBjKDAuMDEyNSwgMCwgMCwgMCkpCmBgYAoKIyMgLiBOdW1iZXIgb2YgZmF0YWxpdGllcyBwZXIgbW9udGggc2luY2UgMTk4MgoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTQuNX0KZyA8LSBieWRheV9kYXQgJT4lCiAgZ3JvdXBfYnkoTW9udGhfZW5kID0gY2VpbGluZ19kYXRlKGBFdmVudCBEYXRlYCwgdW5pdCA9ICJtb250aHMiKSkgJT4lCiAgc3VtbWFyaXplKGBUb3RhbCBGYXRhbCBJbmp1cmllc2AgPSBzdW0oYFRvdGFsIEZhdGFsIEluanVyaWVzYCkpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoX2VuZCwgeSA9IGBUb3RhbCBGYXRhbCBJbmp1cmllc2ApKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fbGluZShzdGF0ID0gInNtb290aCIsIG1ldGhvZCA9IGxvZXNzLCBzZSA9IEZBTFNFLCBzaXplID0gMiwgY29sb3IgPSAiI0RCNEEzNiIsIGFscGhhID0gMC43NSkgKwogIHlsaW0oMCwgTkEpICsKICB4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArIAogIHRoZW1lX2dyYXBoem9vKGJhc2Vfc2l6ZSA9IDIwKQoKZ0Jhbm5lciA8LSBnel9iYW5uZXIobC50eHQgPSAiR1JBUEhaT08uVFVNQkxSLkNPTSIsIAogICAgICAgICAgICAgICAgICAgICByLnR4dCA9ICJEQVRBOiBOVFNCIiwKICAgICAgICAgICAgICAgICAgICAgZm9udC5zaXplID0gNCkKZ1RpdGxlIDwtIGd6X3RpdGxlKCJVUyBjaXZpbCBhdmlhdGlvbiBmYXRhbGl0aWVzLCAxOTgyLTIwMTciLCBzaXplID0gOCkKZ1N1YnRpdGxlIDwtIGd6X3RpdGxlKCJwZXIgbW9udGgsIHdpdGhpbiB0aGUgVVNBLCBpdHMgdGVycml0b3JpZXMgYW5kIHBvc3Nlc3Npb25zLCBhbmQgaW4gaW50ZXJuYXRpb25hbCB3YXRlcnMiLCAKICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjkxMjUsIHNpemUgPSA1LCBmb250ZmFjZSA9ICJpdGFsaWMiKQoKZ3pfY29tYmluZShnLCBnVGl0bGUsIGdTdWJ0aXRsZSwgZ0Jhbm5lciwKICAgICAgICAgICB0b3AgPSBjKDAuOSwgMSwgMSwgMC4wNSksIAogICAgICAgICAgIGJvdHRvbSA9IGMoMC4wMTI1LCAwLCAwLCAwKSkKYGBgCgojIyAuIE51bWJlciBvZiBpbmp1cmllcyBwZXIgbW9udGggc2luY2UgMTk4MgoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTQuNX0KZyA8LSBieWRheV9kYXQgJT4lCiAgZ3JvdXBfYnkoTW9udGhfZW5kID0gY2VpbGluZ19kYXRlKGBFdmVudCBEYXRlYCwgdW5pdCA9ICJtb250aHMiKSkgJT4lCiAgc3VtbWFyaXplKEluanVyaWVzID0gc3VtKGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCkgKyBzdW0oYFRvdGFsIE1pbm9yIEluanVyaWVzYCkpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoX2VuZCwgeSA9IEluanVyaWVzKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX2xpbmUoc3RhdCA9ICJzbW9vdGgiLCBtZXRob2QgPSBsb2Vzcywgc2UgPSBGQUxTRSwgc2l6ZSA9IDIsIGNvbG9yID0gIiNEQjRBMzYiLCBhbHBoYSA9IDAuNzUpICsKICB5bGltKDAsIE5BKSArCiAgeGxhYihOVUxMKSArIHlsYWIoTlVMTCkgKyAKICB0aGVtZV9ncmFwaHpvbyhiYXNlX3NpemUgPSAyMCkKCmdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgci50eHQgPSAiREFUQTogTlRTQiIsCiAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9IDQpCmdUaXRsZSA8LSBnel90aXRsZSgiVVMgY2l2aWwgYXZpYXRpb24gbm9uLWxldGhhbCBpbmp1cmllcywgMTk4Mi0yMDE3Iiwgc2l6ZSA9IDgpCmdTdWJ0aXRsZSA8LSBnel90aXRsZSgicGVyIG1vbnRoLCB3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICB5ID0gMC45MTI1LCBzaXplID0gNSwgZm9udGZhY2UgPSAiaXRhbGljIikKCmd6X2NvbWJpbmUoZywgZ1RpdGxlLCBnU3VidGl0bGUsIGdCYW5uZXIsCiAgICAgICAgICAgdG9wID0gYygwLjksIDEsIDEsIDAuMDUpLCAKICAgICAgICAgICBib3R0b20gPSBjKDAuMDEyNSwgMCwgMCwgMCkpCmBgYAoKIyMgLiBNb250aCB3aXRoIG1vc3QgYWNjaWRlbnRzCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NC41fQpnIDwtIGJ5ZGF5X2RhdCAlPiUKICBncm91cF9ieShNb250aCkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKEV2ZW50cykpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoLCB5ID0gdG90YWwsIGdyb3VwID0gMSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAiI0RCNEEzNiIsIGZpbGwgPSAiI0RCNEEzNiIsIGFscGhhID0gMC43NSkgKwogIHlsaW0oMCwgTkEpICsKICB4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArIAogIHRoZW1lX2dyYXBoem9vKGJhc2Vfc2l6ZSA9IDIwKQoKZ0Jhbm5lciA8LSBnel9iYW5uZXIobC50eHQgPSAiR1JBUEhaT08uVFVNQkxSLkNPTSIsIAogICAgICAgICAgICAgICAgICAgICByLnR4dCA9ICJEQVRBOiBOVFNCIiwKICAgICAgICAgICAgICAgICAgICAgZm9udC5zaXplID0gNCkKZ1RpdGxlIDwtIGd6X3RpdGxlKCJVUyBjaXZpbCBhdmlhdGlvbiBhY2NpZGVudHMsIDE5ODItMjAxNyIsIHNpemUgPSA4KQpnU3VidGl0bGUgPC0gZ3pfdGl0bGUoInRvdGFsIGJ5IG1vbnRoLCB3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICB5ID0gMC45MTI1LCBzaXplID0gNSwgZm9udGZhY2UgPSAiaXRhbGljIikKCmd6X2NvbWJpbmUoZywgZ1RpdGxlLCBnU3VidGl0bGUsIGdCYW5uZXIsCiAgICAgICAgICAgdG9wID0gYygwLjksIDEsIDEsIDAuMDUpLCAKICAgICAgICAgICBib3R0b20gPSBjKDAuMDEyNSwgMCwgMCwgMCkpCmBgYAoKIyMgLiBEYXlzIHdpdGggbW9zdCBhY2NpZGVudHMKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LjV9CmcgPC0gYnlkYXlfZGF0ICU+JQogIGdyb3VwX2J5KERheSkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKEV2ZW50cykpICU+JQogIGdncGxvdChhZXMoeCA9IERheSwgeSA9IHRvdGFsLCBncm91cCA9IDEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIiNEQjRBMzYiLCBmaWxsID0gIiNEQjRBMzYiLCBhbHBoYSA9IDAuNzUpICsKICB5bGltKDAsIE5BKSArCiAgeGxhYihOVUxMKSArIHlsYWIoTlVMTCkgKyAKICB0aGVtZV9ncmFwaHpvbyhiYXNlX3NpemUgPSAyMCkKCmdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgci50eHQgPSAiREFUQTogTlRTQiIsCiAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9IDQpCmdUaXRsZSA8LSBnel90aXRsZSgiVVMgY2l2aWwgYXZpYXRpb24gYWNjaWRlbnRzLCAxOTgyLTIwMTciLCBzaXplID0gOCkKZ1N1YnRpdGxlIDwtIGd6X3RpdGxlKCJ0b3RhbCBieSBkYXksIHdpdGhpbiB0aGUgVVNBLCBpdHMgdGVycml0b3JpZXMgYW5kIHBvc3Nlc3Npb25zLCBhbmQgaW4gaW50ZXJuYXRpb25hbCB3YXRlcnMiLCAKICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjkxMjUsIHNpemUgPSA1LCBmb250ZmFjZSA9ICJpdGFsaWMiKQoKZ3pfY29tYmluZShnLCBnVGl0bGUsIGdTdWJ0aXRsZSwgZ0Jhbm5lciwKICAgICAgICAgICB0b3AgPSBjKDAuOSwgMSwgMSwgMC4wNSksIAogICAgICAgICAgIGJvdHRvbSA9IGMoMC4wMTI1LCAwLCAwLCAwKSkKYGBgCgojIyAuIE1vbnRoIHdpdGggbW9zdCBmYXRhbGl0aWVzCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NC41fQpnIDwtIGJ5ZGF5X2RhdCAlPiUKICBncm91cF9ieShNb250aCkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGBUb3RhbCBGYXRhbCBJbmp1cmllc2ApKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBNb250aCwgeSA9IHRvdGFsLCBncm91cCA9IDEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIiNEQjRBMzYiLCBmaWxsID0gIiNEQjRBMzYiLCBhbHBoYSA9IDAuNzUpICsKICB5bGltKDAsIE5BKSArCiAgeGxhYihOVUxMKSArIHlsYWIoTlVMTCkgKyAKICB0aGVtZV9ncmFwaHpvbyhiYXNlX3NpemUgPSAyMCkKCmdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgci50eHQgPSAiREFUQTogTlRTQiIsCiAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9IDQpCmdUaXRsZSA8LSBnel90aXRsZSgiVVMgY2l2aWwgYXZpYXRpb24gZmF0YWxpdGllcywgMTk4Mi0yMDE3Iiwgc2l6ZSA9IDgpCmdTdWJ0aXRsZSA8LSBnel90aXRsZSgidG90YWwgYnkgbW9udGgsIHdpdGhpbiB0aGUgVVNBLCBpdHMgdGVycml0b3JpZXMgYW5kIHBvc3Nlc3Npb25zLCBhbmQgaW4gaW50ZXJuYXRpb25hbCB3YXRlcnMiLCAKICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjkxMjUsIHNpemUgPSA1LCBmb250ZmFjZSA9ICJpdGFsaWMiKQoKZ3pfY29tYmluZShnLCBnVGl0bGUsIGdTdWJ0aXRsZSwgZ0Jhbm5lciwKICAgICAgICAgICB0b3AgPSBjKDAuOSwgMSwgMSwgMC4wNSksIAogICAgICAgICAgIGJvdHRvbSA9IGMoMC4wMTI1LCAwLCAwLCAwKSkKYGBgCgojIyAuIERheXMgd2l0aCBtb3N0IGZhdGFsaXRpZXMKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LjV9CmcgPC0gYnlkYXlfZGF0ICU+JQogIGdyb3VwX2J5KERheSkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGBUb3RhbCBGYXRhbCBJbmp1cmllc2ApKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBEYXksIHkgPSB0b3RhbCwgZ3JvdXAgPSAxKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICIjREI0QTM2IiwgZmlsbCA9ICIjREI0QTM2IiwgYWxwaGEgPSAwLjc1KSArCiAgeWxpbSgwLCBOQSkgKwogIHhsYWIoTlVMTCkgKyB5bGFiKE5VTEwpICsgCiAgdGhlbWVfZ3JhcGh6b28oYmFzZV9zaXplID0gMjApCgpnQmFubmVyIDwtIGd6X2Jhbm5lcihsLnR4dCA9ICJHUkFQSFpPTy5UVU1CTFIuQ09NIiwgCiAgICAgICAgICAgICAgICAgICAgIHIudHh0ID0gIkRBVEE6IE5UU0IiLAogICAgICAgICAgICAgICAgICAgICBmb250LnNpemUgPSA0KQpnVGl0bGUgPC0gZ3pfdGl0bGUoIlVTIGNpdmlsIGF2aWF0aW9uIGZhdGFsaXRpZXMsIDE5ODItMjAxNyIsIHNpemUgPSA4KQpnU3VidGl0bGUgPC0gZ3pfdGl0bGUoInRvdGFsIGJ5IGRheSwgd2l0aGluIHRoZSBVU0EsIGl0cyB0ZXJyaXRvcmllcyBhbmQgcG9zc2Vzc2lvbnMsIGFuZCBpbiBpbnRlcm5hdGlvbmFsIHdhdGVycyIsIAogICAgICAgICAgICAgICAgICAgICAgeSA9IDAuOTEyNSwgc2l6ZSA9IDUsIGZvbnRmYWNlID0gIml0YWxpYyIpCgpnel9jb21iaW5lKGcsIGdUaXRsZSwgZ1N1YnRpdGxlLCBnQmFubmVyLAogICAgICAgICAgIHRvcCA9IGMoMC45LCAxLCAxLCAwLjA1KSwgCiAgICAgICAgICAgYm90dG9tID0gYygwLjAxMjUsIDAsIDAsIDApKQpgYGAKCiMjIC4gTW9udGggd2l0aCBtb3N0IGluanVyaWVzCgpgYGB7ciwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NC41fQpnIDwtIGJ5ZGF5X2RhdCAlPiUKICBncm91cF9ieShNb250aCkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCkgKyBzdW0oYFRvdGFsIE1pbm9yIEluanVyaWVzYCkpICU+JQogIGdncGxvdChhZXMoeCA9IE1vbnRoLCB5ID0gdG90YWwsIGdyb3VwID0gMSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAiI0RCNEEzNiIsIGZpbGwgPSAiI0RCNEEzNiIsIGFscGhhID0gMC43NSkgKwogIHlsaW0oMCwgTkEpICsKICB4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArIAogIHRoZW1lX2dyYXBoem9vKGJhc2Vfc2l6ZSA9IDIwKQoKZ0Jhbm5lciA8LSBnel9iYW5uZXIobC50eHQgPSAiR1JBUEhaT08uVFVNQkxSLkNPTSIsIAogICAgICAgICAgICAgICAgICAgICByLnR4dCA9ICJEQVRBOiBOVFNCIiwKICAgICAgICAgICAgICAgICAgICAgZm9udC5zaXplID0gNCkKZ1RpdGxlIDwtIGd6X3RpdGxlKCJVUyBjaXZpbCBhdmlhdGlvbiBub24tbGV0aGFsIGluanVyaWVzLCAxOTgyLTIwMTciLCBzaXplID0gOCkKZ1N1YnRpdGxlIDwtIGd6X3RpdGxlKCJ0b3RhbCBieSBtb250aCwgd2l0aGluIHRoZSBVU0EsIGl0cyB0ZXJyaXRvcmllcyBhbmQgcG9zc2Vzc2lvbnMsIGFuZCBpbiBpbnRlcm5hdGlvbmFsIHdhdGVycyIsIAogICAgICAgICAgICAgICAgICAgICAgeSA9IDAuOTEyNSwgc2l6ZSA9IDUsIGZvbnRmYWNlID0gIml0YWxpYyIpCgpnel9jb21iaW5lKGcsIGdUaXRsZSwgZ1N1YnRpdGxlLCBnQmFubmVyLAogICAgICAgICAgIHRvcCA9IGMoMC45LCAxLCAxLCAwLjA1KSwgCiAgICAgICAgICAgYm90dG9tID0gYygwLjAxMjUsIDAsIDAsIDApKQpgYGAKCiMjIC4gRGF5cyB3aXRoIG1vc3QgaW5qdXJpZXMKCmBgYHtyLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LjV9CmcgPC0gYnlkYXlfZGF0ICU+JQogIGdyb3VwX2J5KERheSkgJT4lCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGBUb3RhbCBTZXJpb3VzIEluanVyaWVzYCkgKyBzdW0oYFRvdGFsIE1pbm9yIEluanVyaWVzYCkpICU+JQogIGdncGxvdChhZXMoeCA9IERheSwgeSA9IHRvdGFsLCBncm91cCA9IDEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIiNEQjRBMzYiLCBmaWxsID0gIiNEQjRBMzYiLCBhbHBoYSA9IDAuNzUpICsKICB5bGltKDAsIE5BKSArCiAgeGxhYihOVUxMKSArIHlsYWIoTlVMTCkgKyAKICB0aGVtZV9ncmFwaHpvbyhiYXNlX3NpemUgPSAyMCkKCmdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgci50eHQgPSAiREFUQTogTlRTQiIsCiAgICAgICAgICAgICAgICAgICAgIGZvbnQuc2l6ZSA9IDQpCmdUaXRsZSA8LSBnel90aXRsZSgiVVMgY2l2aWwgYXZpYXRpb24gbm9uLWxldGhhbCBpbmp1cmllcywgMTk4Mi0yMDE3Iiwgc2l6ZSA9IDgpCmdTdWJ0aXRsZSA8LSBnel90aXRsZSgidG90YWwgYnkgZGF5LCB3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICB5ID0gMC45MTI1LCBzaXplID0gNSwgZm9udGZhY2UgPSAiaXRhbGljIikKCmd6X2NvbWJpbmUoZywgZ1RpdGxlLCBnU3VidGl0bGUsIGdCYW5uZXIsCiAgICAgICAgICAgdG9wID0gYygwLjksIDEsIDEsIDAuMDUpLCAKICAgICAgICAgICBib3R0b20gPSBjKDAuMDEyNSwgMCwgMCwgMCkpCmBgYAoKIyAuIFNwYWNlCgojIyAuIFByZXBhcmluZyBkYXRhCgpgYGB7cn0KbG9jX2RhdCA8LSByYXdfZGF0ICU+JQogIGZpbHRlcih5ZWFyKGBFdmVudCBEYXRlYCkgPj0gMjAwMiwgeWVhcihgRXZlbnQgRGF0ZWApIDwgMjAxOCwKICAgICAgICAgIWlzLm5hKExhdGl0dWRlKSwgIWlzLm5hKExvbmdpdHVkZSkpICU+JQogIG11dGF0ZShEYXRlX3JvdW5kID0gY2VpbGluZ19kYXRlKGBFdmVudCBEYXRlYCwgdW5pdCA9ICIzIGRheXMiKSwKICAgICAgICAgTG9uZ2l0dWRlID0gaWZlbHNlKExvbmdpdHVkZSA+IDAsIC1Mb25naXR1ZGUsIExvbmdpdHVkZSkpCmxvY19kYXQKCnhsaW0gPC0gYygtMTgwLCAtMjApCnlsaW0gPC0gYygxMCwgNzIpCndvcmxkX2RhdCA8LSBtYXBfZGF0YSgid29ybGQiKSAlPiUKICByZW5hbWUoWCA9IGxvbmcsIFkgPSBsYXQsIFBJRCA9IGdyb3VwLCBQT1MgPSBvcmRlcikgJT4lCiAgY2xpcFBvbHlzKHhsaW0gPSB4bGltLCB5bGltID0geWxpbSwga2VlcEV4dHJhID0gVFJVRSkgJT4lCiAgYXNfdGliYmxlKCkKd29ybGRfZGF0CmBgYAoKIyMgLiBBbmltYXRlZCBtYXAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LjV9CmlmICghZmlsZS5leGlzdHMoImFuaW1hdGlvbi5tcDQiKSkgewogIGdCYWNrZ3JvdW5kIDwtIGd6X2JhY2tncm91bmQoKQogIGdCYW5uZXIgPC0gZ3pfYmFubmVyKGwudHh0ID0gIkdSQVBIWk9PLlRVTUJMUi5DT00iLCAKICAgICAgICAgICAgICAgICAgICAgICByLnR4dCA9ICJEQVRBOiBOVFNCIiwKICAgICAgICAgICAgICAgICAgICAgICBmb250LnNpemUgPSA0KQogIGdUaXRsZSA8LSBnel90aXRsZSgiTG9jYXRpb25zIG9mIFVTIGNpdmlsIGF2aWF0aW9uIGFjY2lkZW50cywgMjAwMi0yMDE3Iiwgc2l6ZSA9IDgpCiAgZ1N1YnRpdGxlIDwtIGd6X3RpdGxlKCJ3aXRoaW4gdGhlIFVTQSwgaXRzIHRlcnJpdG9yaWVzIGFuZCBwb3NzZXNzaW9ucywgYW5kIGluIGludGVybmF0aW9uYWwgd2F0ZXJzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjkxMjUsIHNpemUgPSA1LCBmb250ZmFjZSA9ICJpdGFsaWMiKQogIAogIHNhdmVWaWRlbyh7CiAgICBkYXRlcyA8LSBzZXEuRGF0ZSh5bWQoIjIwMDItMDEtMDEiKSwgeW1kKCIyMDE3LTEyLTMxIiksIGJ5ID0gMykKICAgIGZvciAoaSBpbiBzZXEoMTpsZW5ndGgoZGF0ZXMpKSkgewogICAgICBnIDwtIGdncGxvdCgpICsKICAgICAgICBnZW9tX3BvbHlnb24oZGF0YSA9IHdvcmxkX2RhdCwgYWVzKHggPSBYLCB5ID0gWSwgZ3JvdXAgPSBQSUQpLAogICAgICAgICAgICAgICAgICAgICBmaWxsID0gImdyYXk1MCIsIGNvbG9yID0gIndoaXRlIikgKwogICAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihsb2NfZGF0LCBEYXRlX3JvdW5kIDw9IGRhdGVzW2ldLCBEYXRlX3JvdW5kID49IChkYXRlc1tpXSAtIDYwKSksIAogICAgICAgICAgICAgICAgICAgYWVzKHggPSBMb25naXR1ZGUsIHkgPSBMYXRpdHVkZSwgYWxwaGEgPSA2MCAtIGFzLm51bWVyaWMoZGF0ZXNbaV0gLSBEYXRlX3JvdW5kKSksIAogICAgICAgICAgICAgICAgICAgcGNoID0gMjEsIGZpbGwgPSAiI0RCNEEzNiIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsKICAgICAgICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMTgwLCB5ID0gMTEsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLAogICAgICAgICAgICAgICAgIGxhYmVsID0gZm9ybWF0KGRhdGVzW2ldLCBmb3JtYXQgPSAiJWIgJVkiKSkgKwogICAgICAgIGNvb3JkX21hcCh4bGltID0geGxpbSwgeWxpbSA9IHlsaW0pICsKICAgICAgICB4bGFiKE5VTEwpICsgeWxhYihOVUxMKSArIGd1aWRlcyhhbHBoYSA9IEZBTFNFKSArIAogICAgICAgIHRoZW1lX2dyYXBoem9vKGJhc2Vfc2l6ZSA9IDE4KSArCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCiAgICAgIAogICAgICBnel9jb21iaW5lKGdCYWNrZ3JvdW5kLCBnLCBnVGl0bGUsIGdTdWJ0aXRsZSwgZ0Jhbm5lciwKICAgICAgICAgICAgICAgICB0b3AgPSBjKDEsIDAuOSwgMSwgMSwgMC4wNSksCiAgICAgICAgICAgICAgICAgYm90dG9tID0gYygwLjA1LCAwLjAxMjUsIDAuMDUsIDAuMDUsIDApKQogICAgfQogIH0sIGFuaS5oZWlnaHQgPSA0ODAsIGFuaS53aWR0aCA9IDcyMCwgaW50ZXJ2YWwgPSAxIC8gMzApCn0KYGBgCgohW0FuaW1hdGlvbl0oYW5pbWF0aW9uLm1wNCkKCgoK